<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title>js面向对象高级编程</title>
		<script type="text/javascript">
			/*
			 * js的面向对象：
			 * 对象的创建方式有3中：
			 * 1、工厂方法（可以有初始化参数列表）
			 * 2、构造方法（可以有初始化参数列表）
			 *   构造方法中使用this代表当前对象，并且this不能省略；
			 *   创建对象时需要使用new 创建；并且new不能省略；
			 * 3、原型法
			 *   扩展对象的属性和行为，当对象被创建以后，就可以使用prototype增加新属性
			 *     语法：
			 *        对象名.prototype.扩展的属性名/方法名 = 属性值/方法匿名定义/已定义的方法名；
			 *   也可以变相实现js对象之间的继承关系
			 * 4、(扩展)
			 *   Object.create(proto[,propertiesObject]是ECMAScript5中提出的一种新的对象创建方式；
			 * 	        参数proto是要使用的原型，即要被继承的对象
			 *    参数propertiesObject（可选）是对象的属性描述符

			 */
			// 工厂方法创建对象（工厂模式的思想）
			function createCar() {
				// new一个Object对象
				var oTempCar = new Object;
				// 成员属性
				oTempCar.color = "red";
				oTempCar.doors = 4;
				// 行为方法
				oTempCar.showColor = function() {
					alert(this.color);
				};
				// 返回创建的对象
				return oTempCar;
			}
			// 获取一个car对象
			var car0 = createCar();
			document.write("<br>I have bought a car with color of "+car0.color);
			
			// 2、构造方法创建对象（使用this表示当前对象）
			function Car() {				
				// 成员属性
				this.color = "red";
				this.doors = 4;
				// 行为方法
				this.showColor = function() {
					alert(this.color);
				};
			}
			// 获取一个car对象
			var car1 = new Car(); // new 不能省略
			document.write("<br>I have bought a car with color of "+car1.color);
			
			// 3、原型法，扩展对象的属性和行为（也可以变相实现js对象之间的继承关系）
			// 使用构造方法方式创建一个bus对象
			function Bus(){
			}   
			// 使用prototype增加新属性，对象名.prototype.扩展的属性名/方法名 = 属性值/方法定义；
			// 扩展属性
			Bus.prototype.color = "red";
			// 扩展行为
			Bus.prototype.run = function(){
				alert(this.color);
			}
			// 创建一个bus对象
			var bus0 = new Bus();
			document.write("<br>I have bought a bus with color of "+bus0.color);
			bus0.run();
			
			/* 创建一个weekday(var)函数，函数功能是返回输入数字（1到7）对应的星期数（如weekday(1)=“星期一”，
			 * 可以使用数组先定义出值的对应）；然后把weekday(var)增加为Date的原型属性，在页面中输出当前日期是星期几？
			 */
			// 定义一个扩展的函数
			function weekday(index){
				// 定义一个需要反悔的数组
				var days = ["星期一","星期二","星期三","星期四","星期五","星期六","星期日"];
				if(index && index>=1 && index<=7){
					// 合法的输入
					return days[index-1];
				}else{
					return "参数非法";
				}
			}
			// 使用原型法为Date对象扩展一个行为
			Date.prototype.weekday = weekday;
			// 创建一个Date对象
			var date0 = new Date();
			document.write("<br>今天是星期几？"+date0.weekday(3));
		</script>
	</head>

	<body>
	</body>

</html>